/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.documentar.util;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 *
 * @author Santos
 */
public class setFiltroCampo extends PlainDocument {

    private final int quantidadeCaracter;
    /**
     * ################### Tipos de filtros são: ###############################
     * - LetraNumeroInteiroEspaco: aceita letras, numeros inteiros e espaço. ###
     * - Letra: aceita apenas letras ###########################################
     * - LetraEspaco: aceita apenas letras e espaco ############################
     * - NumeroInteiro: Aceita apenas numeros inteiros #########################
     * - NumeroDecimal: aceita apenas numero decial
     * #############################
     */
    private final String tipoFiltro;

    /**
     * Formato da letra define se será U - upCase, L - lowCase, ou P - padrão
     */
    private char formatoLetra = 'U';

    /**
     * Metodo responsável por definir os tipos de caracter que um campo irá
     * aceitar
     *
     * @param quantidadeCaracter quantidade maxima de caracter
     * @param tipoFiltro tipo de filtro a ser aplicado
     */
    public setFiltroCampo(int quantidadeCaracter, String tipoFiltro) {
        super();
        this.quantidadeCaracter = quantidadeCaracter;
        this.tipoFiltro = tipoFiltro;

    }

    /**
     * Metodo responsável por definir os tipos de caracter que um campo irá
     * aceitar, junto com o formato da eltra.
     *
     * @param quantidadeCaracter quantidade máxima de caracter
     * @param tipoFiltro tipo de filtroa a ser aplicado
     * @param formatoLetra formato da letra U - Upcase, L - LowCase, P - Padrão
     */
    public setFiltroCampo(int quantidadeCaracter, String tipoFiltro, char formatoLetra) {
        super();
        this.quantidadeCaracter = quantidadeCaracter;
        this.tipoFiltro = tipoFiltro;
        this.formatoLetra = formatoLetra;
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {
        if (str == null) {//em avaliação
            return;
        }
        //tratando o formato da letra
        switch (formatoLetra) {
            case 'U': {
                str = str.toUpperCase();
                break;
            }
            case 'L': {
                str = str.toLowerCase();
                break;
            }
            case 'P': {
                //mantem estrutura comum
                break;
            }
            default: {
                str = str.toUpperCase();
                break;
            }
        }
        /**
         * Valida a quantidade de dados inseridos
         */
        if (quantidadeCaracter <= 0) {// aceitara qualquer no. de caracteres  
            super.insertString(offset, str, attr);
            return;
        }

        /**
         * Verificar se a quantidade de caracter atingiu o máximo do campo
         */
        int ilen = (getLength() + str.length());
        if (ilen <= quantidadeCaracter) {
            switch (tipoFiltro) {
                /**
                 * Aceita apenas números inteiros
                 */
                case "NumeroInteiro":
                    if (str.matches("[0-9]+")) {
                        super.insertString(offset, str, attr);
                    }
                    /**
                     * Aceitas apenas letras, números inteiro e espaço
                     */
                    break;
                case "LetraNumeroInteiroEspaco":
                    if (str.matches("[a-zA-Z0-9\\s\\Ç\\Ã]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "Letra":
                    if (str.matches("[a-zA-Z]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "LetraEspaco":
                    if (str.matches("[a-zA-Z\\s]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "NumeroReal":
                    if (str.matches("[0-9\\.]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "LetraNumeroRealEspaco":
                    if (str.matches("[a-zA-Z0-9\\.\\s]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "LetraNumeroInteiro":
                    if (str.matches("[a-zA-Z0-9]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "Sigla":
                    if (str.matches("[a-zA-Z\\Ó\\_]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "Email":
                    if (str.matches("[A-Za-z0-9\\._@-]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "Versao":
                    if (str.matches("[A-Za-z0-9\\.]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "Texto":
                    if (!str.matches("\\'")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "ObjetoBanco":
                    if (str.matches("[a-zA-Z0-9\\_]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
                case "HostIP":
                    if (str.matches("[a-zA-Z0-9\\-\\.\\_]+")) {
                        super.insertString(offset, str, attr);
                    }
                    break;
            }
        }
    }

}
